﻿using System;

namespace CPN.PJN.Common.Logging
{
    /// <summary>
    /// Cette classe représente un Logger pour les traces applicatives.
    /// </summary>
    public sealed class Logger
    {
        #region Private Members

        /// <summary>
        /// Instance du Logger
        /// </summary>
        private static volatile Logger instance;

        /// <summary>
        /// Objet de synchronisation
        /// </summary>
        private static object syncRoot = new Object();

        /// <summary>
        /// Tracer de Logs
        /// </summary>
        private ILogWriter writer;

        #endregion

        #region Instance Property
        
        /// <summary>
        /// Propriété Instance du Logger
        /// </summary>
        public static Logger Instance
        {
            get
            {
                if (instance == null)
                {
                    lock (syncRoot)
                    {
                        if (instance == null)
                            instance = new Logger();
                    }
                }

                return instance;
            }
        } 

        #endregion

        #region Private Constructor

        /// <summary>
        /// Constructeur privé
        /// </summary>
        private Logger() { }

        #endregion

        #region Initialize Methods

        /// <summary>
        /// Cette méthode permet d'initialiser le logger à utiliser sur l'application
        /// </summary>
        /// <param name="writer">Logger à utiliser</param>
        public void Initialize(ILogWriter writer)
        {
            this.writer = writer;
        }

        /// <summary>
        /// Cette méthode permet d'initialiser le logger à utiliser sur l'application
        /// </summary>
        /// <param name="writer">Logger à utiliser</param>
        /// <param name="parameters">Parametres d'initialisation du Logger</param>
        public void Initialize(ILogWriter writer, params string[] parameters)
        {
            this.writer = writer;
            this.writer.Configure(parameters);
        }

        #endregion

        #region Write Methods

        /// <summary>
        /// Cette méthode écrit le message de log
        /// </summary>
        /// <param name="message">Message de log</param>
        public void Write(object message)
        {
            writer.Write(message);
        }
        /// <summary>
        /// Cette méthode écrit le message de log dans une catégorie précise
        /// </summary>
        /// <param name="message">Message de log</param>
        /// <param name="category">Catégorie de log</param>
        public void Write(object message, string category)
        {
            writer.Write(message, category);
        }
        /// <summary>
        /// Cette méthode écrit le message de log dans une catégorie précise et sa sévérité
        /// </summary>
        /// <param name="message">Message de log</param>
        /// <param name="category">Catégorie de log</param>
        /// <param name="severity">severité</param>
        public void Write(object message, string category, int severity)
        {
            writer.Write(message, category, severity);
        } 

        #endregion
    }
}
